home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / security / log_tcp_6.0alpha.shar / try.c < prev   
C/C++ Source or Header  |  1993-07-02  |  3KB  |  134 lines

  1.  /*
  2.   * try - program to try out host access-control tables, including the
  3.   * optional shell commands.
  4.   * 
  5.   * usage: try process_name host_name_or_address
  6.   * 
  7.   * where process_name is a daemon process name (argv[0] value). If a host name
  8.   * is specified, both the name and address will be used to check the address
  9.   * control tables. If a host address is specified, the program pretends that
  10.   * host name lookup failed.
  11.   * 
  12.   * Most errors will be reported to the syslog daemon, so you'd better keep a
  13.   * tail on the logfile.
  14.   */
  15.  
  16. #ifndef lint
  17. static char sccsid[] = "@(#) try.c 1.3 93/03/07 22:47:43";
  18. #endif
  19.  
  20. #include <sys/types.h>
  21. #include <netinet/in.h>
  22. #include <arpa/inet.h>
  23. #include <netdb.h>
  24. #include <stdio.h>
  25. #include <syslog.h>
  26.  
  27. #ifdef HOSTS_ACCESS
  28.  
  29. #ifndef    INADDR_NONE
  30. #define    INADDR_NONE    (-1)        /* XXX should be 0xffffffff */
  31. #endif
  32.  
  33. #include "log_tcp.h"
  34.  
  35. #ifdef INET_ADDR_BUG
  36. #include "inet_addr_fix"
  37. #endif
  38.  
  39. int     log_severity = SEVERITY;    /* run-time adjustable */
  40.  
  41. /* Try out a (daemon,client) pair */
  42.  
  43. try(daemon, name, addr)
  44. char   *daemon;
  45. char   *name;
  46. char   *addr;
  47. {
  48.     printf(" Daemon:   %s\n", daemon);
  49.     printf(" Hostname: %s\n", name);
  50.     printf(" Address:  %s\n", addr);
  51.     printf(" Access:   %s\n",
  52.        hosts_ctl(daemon, name, addr, "you") ? "granted" : "denied");
  53. }
  54.  
  55. /* function to intercept the real shell_cmd() */
  56.  
  57. void    shell_cmd(cmd, daemon, client)
  58. char   *cmd;
  59. char   *daemon;
  60. struct from_host *client;
  61. {
  62.     char    buf[BUFSIZ];
  63.     int     pid = getpid();
  64.  
  65.     percent_x(buf, sizeof(buf), cmd, daemon, client, pid);
  66.     printf(" Command:  %s\n", buf);
  67. }
  68.  
  69. /* function to intercept the real process_options() */
  70.  
  71. process_options(options, daemon, client)
  72. char   *options;
  73. char   *daemon;
  74. struct from_host *client;
  75. {
  76.     char    buf[BUFSIZ];
  77.     int     pid = getpid();
  78.  
  79.     percent_x(buf, sizeof(buf), options, daemon, client, pid);
  80.     printf(" Options:  %s\n", buf);
  81. }
  82.  
  83. main(argc, argv)
  84. int     argc;
  85. char  **argv;
  86. {
  87.     struct hostent *hp;
  88.  
  89. #ifdef LOG_MAIL
  90.     openlog(argv[0], LOG_PID, FACILITY);
  91. #else
  92.     openlog(argv[0], LOG_PID);
  93. #endif
  94.  
  95.     /*
  96.      * Abuse inet_addr() to find out if a host name or address was specified.
  97.      * 
  98.      * If a host address is specified, pretend that the host name lookup failed.
  99.      * This allows us to simulate the effect of host name lookup failures.
  100.      * 
  101.      * If a host name is specified, insist that the address is known. The reason
  102.      * for giving up is that in real life, a host address is always
  103.      * available.
  104.      */
  105.  
  106.     if (argc != 3) {
  107.     fprintf(stderr, "usage: %s process_name host_name_or_address\n",
  108.         argv[0]);
  109.     return (1);
  110.     }
  111.     if (inet_addr(argv[2]) != INADDR_NONE) {    /* address specified */
  112.     try(argv[1], FROM_UNKNOWN, argv[2]);
  113.     return (0);
  114.     }
  115.     if ((hp = gethostbyname(argv[2])) == 0) {    /* address lookup fails */
  116.     fprintf(stderr, "host %s: address lookup failed\n", argv[2]);
  117.     return (1);
  118.     }
  119.     while (hp->h_addr_list[0])            /* name and address known */
  120.     try(argv[1], hp->h_name,
  121.         inet_ntoa(*(struct in_addr *) * hp->h_addr_list++));
  122.     return (0);
  123. }
  124.  
  125. #else
  126.  
  127. main()
  128. {
  129.     fprintf(stderr, "host access control is not enabled.\n");
  130.     return (1);
  131. }
  132.  
  133. #endif
  134.